/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = msmq_core.h                                                   */
/*  NOTE      =                                                               */
/*  DATE      = 2015/08/13 by wuwk                                            */
/******************************************************************************/
#ifndef _MSMQ_CORE_H_
#define _MSMQ_CORE_H_

#include "frmem.h"
#include "frct_comm.h"
#include "frdb_cursor.h"
#include "frreport_comm.h"
#include "frbyte_buffer.h"

#define MSMQ_NO                                 0
#define MSMQ_YES                                1

#define MSMQ_DECRPC                          1

#define MSMQ_MSG_TYPE_PTP               0
#define MSMQ_MSG_TYPE_PUB               1
#define MSMQ_MSG_TYPE_NOTIFY            2
#define MSMQ_MSG_TYPE_SUB               3

#define MSMQ_STR_LIOR                   "LIOR"

#define MSMQ_HEAD_LEN                   36

/*
*  MSMQ请求数据
*/
typedef struct __st_msmq_frbyte_request {
    unsigned long ul_seq;                             /* 序列号，1次req和response时，使用同一个序列号 */
    int i_responserequired;                           /* 是否需要应答   0:不需要;1:需要 */
    Frbyte_Packet *p_st_data_req;                     /* request数据 */
    unsigned int ui_data_len;                         /* 数据包解析出来的长度 */
    unsigned int ui_recv_len;                         /* 已经接收的长度 */
    unsigned int ui_left_len;                         /* 还需要接收的长度 */
    unsigned int ui_msg_len;                          /* 消息内容长度 */
    unsigned int ui_msg_left_len;                     /* 剩余的消息长度 */
    Frreport_body_data *p_st_body_data_req;           /* request上报数据 */
    Frtrans_info st_trans_info;                       /* 传输信息 */
} Msmq_frbyte_req;

/*
*  MSMQ响应数据
*/
typedef struct __st_msmq_frbyte_response {
    int i_asyn_flag;                                  /* 0:同步数据 1:异步数据 */
    Frbyte_Packet *p_st_data_resp;                    /* response数据 */
    unsigned int ui_data_len;                         /* 数据包解析出来的长度 */
    unsigned int ui_recv_len;                         /* 已经接收的长度 */
    unsigned int ui_left_len;                         /* 还需要接收的长度 */
    Frreport_body_data *p_st_body_data_resp;          /* response上报数据 */
} Msmq_frbyte_resp;


typedef struct __st_msmq_frbyte_req_list {
    Msmq_frbyte_req *p_st_node;
    struct __st_msmq_frbyte_req_list *next;
} Msmq_frbyte_req_list;

typedef struct __st_msmq_report_list {
    unsigned long ul_seq;
    int i_responserequired;
    int i_reported;
    Frreport_body_data *p_st_body_data;
    Frtrans_info st_trans_info;
    struct __st_msmq_report_list *next;
} Msmq_report_list;

/* session信息 */
typedef struct __st_msmq_l7_session {
    char *p_server;
    char *p_queue_name;
    char *p_title;
} Msmq_L7session;

/*
 *  MSMQ私有数据
*/
typedef struct __st_L7session_msmq_private {
    int i_msg_type;                                       /* 消息类型 0:PTP 1:PUB 2:NOTIFY 3:SUB */
    int i_need_resp;
    int i_protocol_type;
    int i_is_get;
    Msmq_report_list *p_lst_noreport_req;                 /* 未上报的请求 */
    Msmq_frbyte_req *p_st_last_req;                       /* 最后一个请求 */
    Msmq_frbyte_req *p_st_req;                            /* MSMQ请求数据 */
    Msmq_frbyte_resp *p_st_resp;                          /* MSMQ响应数据 */
    Frtrans_info st_trans_info;                           /* 传输信息 */
    Msmq_L7session *p_st_l7_session;                      /* session信息 */
} L7session_msmq_private;


int msmq_detect(Conntrack *p_st_conn, Apm_packet *p_st_packet);
int msmq_analysis(Conntrack *p_st_conn
                , Apm_packet *p_st_packet
                , Frhash_header *p_st_hash_report);
int msmq_session_destroy(void *p_private_session);

#endif
